/*
Copyright (C) 2008 raohmaru <http://www.raohmaru.com>

This file is part of Raohmaru AS3 Framework.

Raohmaru AS3 Framework is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Raohmaru AS3 Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with Raohmaru AS3 Framework.  If not, see <http://www.gnu.org/licenses/>.
*/

package jp.raohmaru.system.data
{
import flash.events.*;

import jp.raohmaru.net.DataLoader;

/**
 * Se distribuye tras decodificar y colocar todos los datos recibidos en la propiedad <code>data</code> del objeto ExternalData.
 * @eventType flash.events.Event.COMPLETE
 */
[Event(name="complete", type="flash.events.Event") ]

/**
 * Se distribuye cuando se produce un error de entrada o salida que provoca que una operación de carga se realice incorrectamente.
 * @eventType flash.events.IOErrorEvent.IO_ERROR
 */
[Event(name="ioError", type="flash.events.IOErrorEvent") ]

/**
 * Se distribuye al recibirse datos mientras progresa una operación de descarga.
 * @eventType flash.events.ProgressEvent.PROGRESS
 */
[Event(name="progress", type="flash.events.ProgressEvent") ]

/**
 * La clase ExternalData representa una objeto que permite cargar y almacenar datos en la instancia, disparando un evento al finalizar o en caso de error.
 * @author raohmaru
 * @version 1.1
 */
public class ExternalData extends SimpleData
{
	/**
	 * Crea una nueva instancia de la clase ExternalData.
	 */
	public function ExternalData ()
	{
	}

	/**
	 * Método abstracto para inicializar la clase. Debe definirse en las clases descendientes.
	 */
	public function init() : void
	{
	}

	/**
	 * Carga datos externos genéricos que luego se almacenarán en la propiedad <code>data</code>.
	 * @param url Dirección URL a cargar.
	 * @param vars Variables a enviar (una cadena con los pares nombre/valor o un objeto URLVariables).
	 * @param method Método POST o GET a utilizar al enviar datos.
	 * @see jp.raohmaru.net.DataLoader#load
	 */
	public function load(url : String, vars : Object = null, method : String = "GET") : void
	{
		var data_loader : DataLoader = new DataLoader();
			data_loader.method = method;
			data_loader.addEventListener(Event.COMPLETE, onLoad);
			data_loader.addEventListener(IOErrorEvent.IO_ERROR, onLoad);			data_loader.addEventListener(ProgressEvent.PROGRESS, onProgress);
			data_loader.load(url, vars);
	}

	/**
	 * @private
	 */
	protected function onLoad(e :Event) : void
	{
		if(e.type == Event.COMPLETE)
			_data = e.target.data;

		dispatchEvent(e);
	}
	
	/**
	 * @private
	 */
	protected function onProgress(e :ProgressEvent) : void
	{
		dispatchEvent(e);
	}
}
}